package com.example.demo1.temp;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
    import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * @author Lenovo
 * java8 四个核心内置函数式接口
 *  Consumer<T> 消费型接口
 *      void accept(T t)
 *  Supplier<T> 供给型接口
 *      T get();
 *  Function<T,R> :函数型接口
 *      R apply(T t);
 *  Predicate <T> ： 断言型接口
 *      boolean test(T t);
 */
public class LambdaTest4 {
    /**------------------Consumer<T> 消费型接口    void accept(T t)-----------------*/
    @Test
    public void test1(){
        happy(10000, x->System.out.println("花费"+x));
    }
    public void happy(double money,Consumer<Double> consumer){
        consumer.accept(money);
    }
    /**-----------------Supplier<T> 供给型接口    T get();---------------------------*/
    @Test
    public void test2(){
        List<Integer> nums = getNumberList(10,()->(int)(Math.random() * 100));
        for (Integer num : nums) {
            System.out.println(num);
        }
    }
    /**
     * X产生制定个数的整数放入集合
     */
    public List<Integer> getNumberList(int num ,Supplier<Integer> supplier){
        List<Integer> list = new ArrayList<>();
        for (int i=0;i<num;i++){
            list.add(supplier.get());
        }
        return  list;
    }
    /**-------------------------Function<T> 函数型接口    T get();--------------*/

    @Test
    public void test3(){
        String s = stringHandle("123456789",str->str.replace("1","2"));
        System.out.println(s);
        String s1 = stringHandle("java8新特性", str -> str.substring(5));
        System.out.println(s1);
    }
    /** 处理字符串
     * @param s  字符参数
     * @param myFunction lambda表达式
     * @return 处理后的结果
     */
    public String stringHandle(String s , Function<String,String> myFunction){
        return  myFunction.apply(s);
    }

    /**------------------------ Predicate <T> ： 断言型接口   boolean test(T t);--------------*/

    //需求将满足条件的字符串返回到集合中去
    @Test
    public void test4() {
        List<String> str = Arrays.asList("ziyou","mingzhu ","fazhi","gongzheng");
        List<String> res = filterStr(str, x -> x.contains("i"));
        for (String re : res) {
            System.out.println(re);
        }
    }
    /**
     *
     * @Author tang
     * @Date 2021-10-25
     * @Param list 待处理的字符数组
     * @param pre lambda表达式
     * @Return  需求将满足条件的字符串返回到集合中去
     **/
    public  List<String> filterStr(List<String> list ,Predicate <String> pre){
        List <String> res = new ArrayList<>();
        for (String s : list) {
            if (pre.test(s)){
                res.add(s);
            }
        }
        return res;
    }

}
